package com.ruoyi.web.controller.admin.newSystem;

import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.RoleDO;
import com.ruoyi.common.core.domain.permission.vo.role.*;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.CommonStatusEnum;
import com.ruoyi.newSystem.service.RoleService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.beans.BeanUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.io.IOException;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;

import static java.util.Collections.singleton;

/**
 * The type Role controller.
 */
@Tag(name = "管理后台 - 角色")
@RestController
@RequestMapping("/newSystem/role")
@Validated
public class RoleController extends BaseController {

    @Resource
    private RoleService roleService;

    /**
     * 创建角色
     *
     * @param reqVO 创建角色信息
     * @return 角色编号 long
     */
    @PostMapping("/add")
    public AjaxResult createRole(@Valid @RequestBody RoleCreateReqVO reqVO) throws Exception {
        return success(roleService.createRole(reqVO, null));
    }

    /**
     * 更新角色
     *
     * @param reqVO 更新角色信息
     */
    @PutMapping("/edit")
    public AjaxResult edit(@Valid @RequestBody RoleUpdateReqVO reqVO) throws Exception {
        roleService.updateRole(reqVO);
        return success(true);
    }

    /**
     * 删除角色
     *
     * @param id 角色编号
     */
    @PostMapping("/delete")
    public AjaxResult delete(@RequestParam("id") Long id) throws Exception {
        roleService.deleteRole(id);
        return success(true);
    }

    /**
     * 更新角色状态
     *
     * @param reqVO the req vo
     * @return the common result
     */
    @PutMapping("/updateRoleStatus")
    public AjaxResult updateRoleStatus(@Valid @RequestBody RoleUpdateStatusReqVO reqVO) throws Exception {
        roleService.updateRoleStatus(reqVO.getId(), reqVO.getStatus());
        return success(true);
    }

    /**
     * 设置角色的数据权限
     */
    @PutMapping("/updateRoleDataScope")
    public AjaxResult updateRoleDataScope(@Valid @RequestBody RoleDO roleDO) throws Exception {
        roleService.updateRoleDataScope(roleDO.getId(), roleDO.getDataScope(), roleDO.getDataScopeAccessIds());
        return success(true);
    }

    /**
     * 获得角色
     *
     * @param id 角色编号
     * @return 角色 role
     */
    @GetMapping("/detail")
    public AjaxResult detail(@RequestParam("id") Long id) {
        RoleDO role = roleService.getRole(id);
        RoleRespVO vo = new RoleRespVO();
        BeanUtils.copyProperties(role, vo);
        return success(vo);
    }

    /**
     * 获得角色列表
     *
     * @return 角色列表 role list
     */
    @PostMapping("/getRoleListById")
    public AjaxResult getRoleListById(@RequestBody Collection<Long> ids) throws IOException {
        List<RoleDO> list = roleService.getRoleList(ids);
        return success(list);
    }

    /**
     * 获得角色列表
     *
     * @return 角色列表 role list by status
     */
    @GetMapping("/listAllSimple")
    public AjaxResult getRoleListByStatus() {
        // 获得角色列表，只要开启状态的
        List<RoleDO> list = roleService.getRoleListByStatus(singleton(CommonStatusEnum.ENABLE.getStatus()));
        // 排序后，返回给前端
        list.sort(Comparator.comparing(RoleDO::getSort));
        return success(list);
    }

    /**
     * 获得所有角色列表
     *
     * @return 角色列表 role list
     */
    @GetMapping("/index")
    public TableDataInfo index() {
        startPage();
        return getDataTable(roleService.getRoleList());
    }

    /**
     * 获得角色分页
     *
     * @param reqVO 角色分页查询
     * @return 角色分页结果 role page
     */
    @GetMapping("/getRolePage")
    @Operation(summary = "获得角色分页")
    public AjaxResult getRolePage(@Valid RolePageReqVO reqVO) {
//        startPage();
        return success(roleService.getRolePage(reqVO));
    }

    /**
     * 获得角色列表
     *
     * @param reqVO 列表查询
     * @return 角色列表 role list
     */
    @GetMapping("/getRoleList")
    public AjaxResult getRoleList(@Valid RoleExportReqVO reqVO) {
        return success(roleService.getRoleList(reqVO));
    }

    /**
     * 判断角色编号数组中，是否有管理员
     *
     * @param ids 角色编号数组
     * @return 是否有管理员 boolean
     */
    @GetMapping("/hasAnySuperAdmin")
    public AjaxResult hasAnySuperAdmin(@RequestParam("ids") Collection<Long> ids) {
        return roleService.hasAnySuperAdmin(ids) ? AjaxResult.success() : AjaxResult.error();
    }

    /**
     * 判断角色编号数组中，是否有管理员
     *
     * @param ids 角色编号数组
     * @return 是否有管理员 boolean
     */
    @GetMapping("/validateRoleList")
    public AjaxResult validateRoleList(@RequestParam("ids") Collection<Long> ids) throws Exception {
        roleService.validateRoleList(ids);
        return success();
    }

    /**
     * 获取这个角色所有的权限范围（包括faq ,知识库）
     *
     * @return
     */
    @GetMapping("/getDataScope")
    public AjaxResult getDataScope() {
        return success(roleService.getDataScope());
    }
}
